www.gusucode.com > VC++网络版的打字软件源程序-源码程序 > VC++网络版的打字软件源程序-源码程序\code\TypeSrv V2.0\TypeSrvDoc.cpp
//Download by http://www.NewXing.com // TypeSrvDoc.cpp : implementation of the CTypeSrvDoc class // #include "stdafx.h" #include "TypeSrv.h" #include "TypeSrvDoc.h" #include "TypeSrvView.h" #include "MainView.h" #include "QuestionDlg.h" #include "ScoreDlg.h" #include "LoginDlg.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif #define DEFAULT_INPUT_LANGUAGE 0 //默认输入法:英文 #define DEFAULT_TEST_TIME 600 //默认测试时间:600秒(10分钟) ///////////////////////////////////////////////////////////////////////////// // CTypeSrvDoc #define PORT_DEFAULT 62248 #include "TypeSrvView.h" IMPLEMENT_DYNCREATE(CTypeSrvDoc, CDocument) BEGIN_MESSAGE_MAP(CTypeSrvDoc, CDocument) //{{AFX_MSG_MAP(CTypeSrvDoc) ON_COMMAND(ID_TYPESRV_LOGIN, OnTypesrvLogin) ON_COMMAND(ID_TYPESRV_LOGOUT, OnTypesrvLogout) ON_COMMAND(ID_QUESTION_DLG, OnQuestionDlg) ON_COMMAND(ID_SCORE_DLG, OnScoreDlg) ON_COMMAND(ID_DATA_BACKUP, OnDataBackup) ON_COMMAND(ID_DATA_RECOVER, OnDataRecover) ON_UPDATE_COMMAND_UI(ID_TYPESRV_LOGIN, OnUpdateTypesrvLogin) ON_UPDATE_COMMAND_UI(ID_TYPESRV_LOGOUT, OnUpdateTypesrvLogout) //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CTypeSrvDoc construction/destruction CTypeSrvDoc::CTypeSrvDoc() { // TODO: add one-time construction code here m_lID = 0; m_strDate = _T(""); m_strQuestionInfo = _T(""); m_strQuestion = _T(""); m_lTestTime = DEFAULT_TEST_TIME; m_nInputLanguage = DEFAULT_INPUT_LANGUAGE; m_pListenSocket = NULL; m_pSrvView = NULL; m_pMainView = NULL; m_bShowMainView = TRUE; m_bLogin = FALSE; } CTypeSrvDoc::~CTypeSrvDoc() { if(m_pListenSocket!=NULL) { m_pListenSocket->Close(); delete m_pListenSocket; m_pListenSocket=NULL; } } BOOL CTypeSrvDoc::OnNewDocument() { if (!CDocument::OnNewDocument()) return FALSE; // TODO: add reinitialization code here // (SDI documents will reuse this document) SetTitle("(作者:蔡良辉 CopyRight 2005-2006)"); return TRUE; } ///////////////////////////////////////////////////////////////////////////// // CTypeSrvDoc serialization void CTypeSrvDoc::Serialize(CArchive& ar) { if (ar.IsStoring()) { // TODO: add storing code here } else { // TODO: add loading code here } } ///////////////////////////////////////////////////////////////////////////// // CTypeSrvDoc diagnostics #ifdef _DEBUG void CTypeSrvDoc::AssertValid() const { CDocument::AssertValid(); } void CTypeSrvDoc::Dump(CDumpContext& dc) const { CDocument::Dump(dc); } #endif //_DEBUG ///////////////////////////////////////////////////////////////////////////// // CTypeSrvDoc commands void CTypeSrvDoc::UpdateUserInfo() { UpdateAllViews(NULL); } void CTypeSrvDoc::OnTypesrvLogin() { // TODO: Add your command handler code here CString str; CLoginDlg dlg; if(dlg.DoModal()==IDOK) { m_pListenSocket=new CListenSocket; m_pListenSocket->SetTypeSrvDoc(this); if(m_pListenSocket->Create(PORT_DEFAULT)) { if(!m_pListenSocket->Listen()) { AfxMessageBox("侦听失败!"); return; } } SetTitle("已启动网上考试"); m_lID=dlg.m_lID; m_strQuestionInfo=dlg.m_strQuestionInfo; m_strQuestion=dlg.m_strQuestion; m_lTestTime=dlg.m_lTestTime*60;//转化为秒 m_nInputLanguage=dlg.m_nInputLanguage; CTime tm=CTime::GetCurrentTime(); m_strDate.Format("%d年%d月%d日",tm.GetYear(),tm.GetMonth(),tm.GetDay()); m_bLogin=TRUE; if(!SwitchToView(RUNTIME_CLASS(CTypeSrvView))) { return; } m_bShowMainView=FALSE; m_pSrvView->ShowQuestion(m_strDate,m_strQuestionInfo,m_strQuestion); str.Format("服务器已启动!(%s)",GetCurrentTime()); m_pSrvView->ReceiveMsg(str); } } void CTypeSrvDoc::ReceiveUserInfo(LPCTSTR lpszHostName,LPCTSTR lpszID, LPCTSTR lpszName) { if(m_pSrvView!=NULL) { CString str; str.Format("客户机[%s]已登陆考试系统!(%s)",lpszHostName,GetCurrentTime()); m_pSrvView->ReceiveMsg(str); str.Format("%s号%s验证成功!",lpszID,lpszName); m_pSrvView->ReceiveMsg(str); } UpdateAllViews(NULL); } void CTypeSrvDoc::OnTypesrvLogout() { // TODO: Add your command handler code here if(m_pListenSocket==NULL) { SetTitle("网上服务器还没启动"); return; } m_pListenSocket->Close(); delete m_pListenSocket; m_pListenSocket=NULL; m_bLogin=FALSE; if(!SwitchToView(RUNTIME_CLASS(CMainView))) { return; } m_bShowMainView=TRUE; SetTitle("网上考试服务器已关闭"); } void CTypeSrvDoc::OnQuestionDlg() { // TODO: Add your command handler code here CQuestionDlg dlg; dlg.DoModal(); } void CTypeSrvDoc::ReceiveSaveScore(CString strID, CString strName, int nRate, int nSpeed) { if(m_pSrvView!=NULL) { m_pSrvView->AddScore(strID,strName,nRate,nSpeed); CString str; str.Format("%s号%s已考完!(%s)",strID,strName,GetCurrentTime()); m_pSrvView->ReceiveMsg(str); } } void CTypeSrvDoc::RefrushUserList(CStringList* pUserList) { m_pSrvView->RefrushUserList(pUserList); } void CTypeSrvDoc::OnScoreDlg() { // TODO: Add your command handler code here CScoreDlg ScoreDlg; ScoreDlg.DoModal(); if(m_bShowMainView) { m_pMainView->ShowAll(); } } BOOL CTypeSrvDoc::SwitchToView(CRuntimeClass *pNewViewClass) { CFrameWnd* pMainWnd=(CFrameWnd*)AfxGetMainWnd(); CView* pOldActiveView=pMainWnd->GetActiveView(); if(pOldActiveView->IsKindOf(pNewViewClass)) return TRUE; ::SetWindowLong(pOldActiveView->m_hWnd,GWL_ID,0); CCreateContext context; context.m_pNewViewClass=pNewViewClass; context.m_pCurrentFrame=pMainWnd; context.m_pNewDocTemplate = NULL; context.m_pCurrentDoc=this; CView* pNewView=STATIC_DOWNCAST(CView,pMainWnd->CreateView(&context)); if(pNewView!=NULL) { pNewView->ShowWindow(SW_SHOW); pNewView->OnInitialUpdate(); pMainWnd->SetActiveView(pNewView); pMainWnd->RecalcLayout(); pOldActiveView->DestroyWindow(); return TRUE; } return FALSE; } void CTypeSrvDoc::OnDataBackup() { // TODO: Add your command handler code here char buf[256]; GetModuleFileName(NULL,buf,256); CString str=buf; int pos=str.ReverseFind('\\'); CString sPath=str.Left(pos+1); CString sDataPath=sPath+"Data\\TypeData.mdb"; CString sBackPath=sPath+"Data\\TypeData.bak"; CString szFilter= "备份文件 (*.bak)|*.bak|所有文件 (*.*)|*.*||"; CFileDialog dlg(FALSE,"*.bak","TypeData.bak",OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,szFilter); if(dlg.DoModal()!=IDOK) { AfxMessageBox("数据备份失败!"); return; } sBackPath=dlg.GetPathName(); if(CopyFile(sDataPath,sBackPath,FALSE)) { AfxMessageBox("数据备份成功!"); } else { AfxMessageBox("数据备份失败!"); } } void CTypeSrvDoc::OnDataRecover() { // TODO: Add your command handler code here if(AfxMessageBox("还原数据库将覆盖原来的数据库。您确定要还原吗?",MB_OKCANCEL)==IDCANCEL) { return; } char buf[256]; GetModuleFileName(NULL,buf,256); CString str=buf; int pos=str.ReverseFind('\\'); CString sPath=str.Left(pos+1); CString sDataPath=sPath+"Data\\TypeData.mdb"; CString sBackPath=sPath+"Data\\TypeData.bak"; CString szFilter= "备份文件 (*.bak)|*.bak|所有文件 (*.*)|*.*||"; CFileDialog dlg(TRUE,"*.bak","TypeData.bak",OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,szFilter); if(dlg.DoModal()!=IDOK) { AfxMessageBox("数据还原失败!"); return; } sBackPath=dlg.GetPathName(); if(CopyFile(sBackPath,sDataPath,FALSE)) { if(m_bShowMainView) { m_pMainView->ShowAll(); } AfxMessageBox("数据还原成功!"); } else { AfxMessageBox("数据还原失败!"); } } void CTypeSrvDoc::OnUpdateTypesrvLogin(CCmdUI* pCmdUI) { // TODO: Add your command update UI handler code here if(!m_bLogin) { pCmdUI->Enable(TRUE); } else { pCmdUI->Enable(FALSE); } } void CTypeSrvDoc::OnUpdateTypesrvLogout(CCmdUI* pCmdUI) { // TODO: Add your command update UI handler code here if(m_bLogin) { pCmdUI->Enable(TRUE); } else { pCmdUI->Enable(FALSE); } } CString CTypeSrvDoc::GetCurrentTime() { CTime tm=CTime::GetCurrentTime(); CString str=tm.Format("%m-%d %H:%M:%S"); return str; } void CTypeSrvDoc::ReceiveUserLogout(CString strID, CString strName) { if(m_pSrvView!=NULL) { CString str; str.Format("%s号%s离开考试系统!(%s)",strID,strName,GetCurrentTime()); m_pSrvView->ReceiveMsg(str); } } void CTypeSrvDoc::ReceiveClientClose(CString strHostName) { if(m_pSrvView!=NULL) { CString str; str.Format("客户机[%s]断开连接!(%s)",strHostName,GetCurrentTime()); m_pSrvView->ReceiveMsg(str); } }